package 链表;

/**
 * @ClassName : _203_移除链表元素
 * @Author : 骆发茂
 * @Date: 2021/12/7 12:36
 * @Description :https://leetcode-cn.com/problems/remove-linked-list-elements/
 */
public class _203_移除链表元素_删除头结点时另做考虑 extends ListNode{
    _203_移除链表元素_删除头结点时另做考虑(int x) {
        super(x);
    }

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode() {}
     *     ListNode(int val) { this.val = val; }
     *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
     * }
     */
    class Solution {
        public ListNode removeElements(ListNode head, int val) {
            //当head.val是和val相同的时候，后面的head覆盖掉head
            while(head!=null&&head.val ==val){
                head = head.next;
            }
            //当while执行完后，才if判断，注意while和if的顺序不能调换，否则空指针异常
            //当[7,7,7,7,7]->最后是null，return null(即是head)
            if(head==null){
                return head;
            }


            ListNode pre = head;
            ListNode cur = head.next;
            while(cur!=null){
                //当下一个节点的val是要求的val时候，pre.next指向下下节点，跳过下一个节点
                if(cur.val==val){
                    pre.next = cur.next;
                }
                //否则，当下一个节点的val不是要求的val时候，说明这一节点和下一节点的联系没问题
                //查看下一个对节点间的联系
                //下一节点覆盖当前节点
                else{
                    pre = cur;
                }
                //下下一节点覆盖掉下一节点
                //不管if，else，都要执行
                cur = cur.next;
            }
            return head;
        }
    }
}